import json
import yaml
import configparser
from typing import Dict, Any, List, Generator


class ConfigManager:
    @staticmethod
    def ini_load(filename: str) -> Dict[str, Dict[str, str]]:
        """
        从 INI 格式的配置文件中加载配置项并返回。

        参数：
        - filename: 字符串，要加载的 INI 文件的路径。

        返回值：
        - config_dict: 字典，包含从 INI 文件中加载的配置项。
        """
        config = configparser.ConfigParser()
        config.read(filename, encoding="utf-8")
        config_dict = {}
        for section in config.sections():
            config_dict[section] = dict(config.items(section))
        return config_dict

    @staticmethod
    def json_load(filename: str) -> Dict[str, Any]:
        """
        从 JSON 格式的配置文件中加载配置项并返回。

        参数：
        - filename: 字符串，要加载的 JSON 文件的路径。

        返回值：
        - config_dict: 字典，包含从 JSON 文件中加载的配置项。
        """
        with open(file=filename, mode='r',encoding="utf-8") as file:
            return json.load(fp=file)

    @staticmethod
    def json_loads(data: str) -> Dict[str, Any]:
        """
        从 JSON 格式的字符串中加载配置项并返回。

        参数：
        - data: 字符串，包含 JSON 格式的配置项。

        返回值：
        - config_dict: 字典，包含从 JSON 字符串中加载的配置项。
        """
        return json.loads(s=data)

    @staticmethod
    def json_dump(data: Dict[str, Any], filename: str,ensure_ascii=False) -> None:
        """
        将配置项写入到 JSON 文件中。

        参数：
        - data: 字典，包含要写入到 JSON 文件的配置项。
        - filename: 字符串，要写入的 JSON 文件的路径。
        - ensure_ascii : 布尔值，是否将非 ASCII 字符转为 Unicode 字符。如果包含有中文就选择False就可以.
        """
        with open(file=filename, mode='w',encoding="utf-8") as fileobject:
            json.dump(obj=data, fp=fileobject, indent=4,ensure_ascii=ensure_ascii)

    @staticmethod
    def json_dumps(data: Dict[str, Any],ensure_ascii=False) -> str:
        """
        将配置项转换为 JSON 格式的字符串并返回。

        参数：
        - data: 字典，包含要转换为 JSON 字符串的配置项。
        - ensure_ascii=False: 布尔值，是否将非 ASCII 字符转为 Unicode 字符。如果包含有中文就选择False就可以.
        返回值：
        - json_str: 字符串，包含 JSON 格式的配置项。
        """
        return json.dumps(data, indent=4,ensure_ascii=ensure_ascii)

    @staticmethod
    def yaml_load(filename: str) -> Dict[str, Any]:
        """
        从 YAML 格式的配置文件中加载配置项并返回。

        参数：
        - filename: 字符串，要加载的 YAML 文件的路径。

        返回值：
        - config_dict: 字典，包含从 YAML 文件中加载的配置项。
        """
        with open(file=filename,mode='r',encoding="utf-8") as fileobject:
            return yaml.load(stream=fileobject,Loader=yaml.Loader)

    @staticmethod
    def yaml_load_all(filename: str) -> Generator[Dict[str, Any], None, None]:
        """
        从 YAML 格式的配置文件中加载多个文档并返回生成器。

        参数：
        - filename: 字符串，要加载的 YAML 文件的路径。

        返回值：
        - generator: 生成器，用于逐个生成从 YAML 文件中加载的配置项。
        """
        with open(file=filename,mode='r',encoding="utf-8") as fileobject:
            return yaml.load_all(stream=fileobject,Loader=yaml.Loader)

    @staticmethod
    def yaml_safe_load(filename: str) -> Dict[str, Any]:
        """
        从 YAML 格式的配置文件中安全加载配置项并返回。

        参数：
        - filename: 字符串，要加载的 YAML 文件的路径。

        返回值：
        - config_dict: 字典，包含从 YAML 文件中加载的配置项。
        """
        with open(file=filename,mode='r',encoding="utf-8") as fileobject:
            return yaml.safe_load(stream=fileobject)

    @staticmethod
    def yaml_safe_load_all(filename: str) -> Generator[Dict[str, Any], None, None]:
        """
        从 YAML 格式的配置文件中安全加载多个文档并返回生成器。

        参数：
        - filename: 字符串，要加载的 YAML 文件的路径。

        返回值：
        - generator: 生成器，用于逐个生成从 YAML 文件中加载的配置项。
        """
        with open(file=filename,mode='r',encoding="utf-8") as fileobject:
            return yaml.safe_load_all(stream=fileobject)

    @staticmethod
    def yaml_dump(data: Dict[str, Any], filename: str) -> None:
        """
        将配置项写入到 YAML 文件中。

        参数：
        - data: 字典，包含要写入到 YAML 文件的配置项。
        - filename: 字符串，要写入的 YAML 文件的路径。
        """
        with open(file=filename,mode='w',encoding="utf-8") as fileobject:
            yaml.dump(data=data,stream=fileobject)

    @staticmethod
    def yaml_dump_all(data: List[Dict[str, Any]], filename: str) -> None:
        """
        将多个配置项写入到 YAML 文件中。

        参数：
        - data: 列表，包含要写入到 YAML 文件的多个配置项。
        - filename: 字符串，要写入的 YAML 文件的路径。
        """
        with open(file=filename,mode='w',encoding="utf-8") as fileobject:
            yaml.dump_all(data=data,stream=fileobject)

    @staticmethod
    def yaml_safe_dump(data: Dict[str, Any], filename: str) -> None:
        """
        将配置项安全地写入到 YAML 文件中。

        参数：
        - data: 字典，包含要写入到 YAML 文件的配置项。
        - filename: 字符串，要写入的 YAML 文件的路径。
        """
        with open(file=filename,mode='w',encoding="utf-8") as fileobject:
            yaml.safe_dump(data=data,stream=fileobject)

    @staticmethod
    def yaml_safe_dump_all(data: List[Dict[str, Any]], filename: str) -> None:
        """
        将多个配置项安全地写入到 YAML 文件中。

        参数：
        - data: 列表，包含要写入到 YAML 文件的多个配置项。
        - filename: 字符串，要写入的 YAML 文件的路径。
        """
        with open(file=filename,mode='w',encoding="utf-8") as fileobject:
            yaml.safe_dump_all(data=data,stream=fileobject)